package com.ruoyi.system.dto;

import com.ruoyi.system.entity.ContractFile;
import lombok.Data;
import org.hibernate.validator.constraints.Length;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;

/**
 * 合同更新数据传输对象
 * 用于接收合同更新时的相关参数
 */
@Data
public class ContractUpdateDTO {

    /**
     * 合同ID
     * 必须存在，用于定位要更新的合同
     */
    @NotNull(message = "合同ID不能为空")
    private Long id;

    /**
     * 合同类型
     * 枚举值：1-施工合同，2-整装合同，3-主材合同，4-软装合同
     */
    @NotBlank(message = "合同类型不能为空")
    private String contractType;

    /**
     * 合同名称
     */
    @NotBlank(message = "合同名称不能为空")
    @Length(max = 255, message = "合同名称长度不能超过255个字符")
    private String contractName;

    /**
     * 纸质合同编号
     * 唯一标识，用于与实体合同对应
     */
    @NotBlank(message = "纸质合同编号不能为空")
    @Length(max = 50, message = "纸质合同编号长度不能超过50个字符")
    private String paperContractNo;

    /**
     * 签订人姓名
     */
    @NotBlank(message = "签订人姓名不能为空")
    private String signer;

    /**
     * 签订日期
     * 格式：YYYY-MM-DD
     */
    @NotNull(message = "签订日期不能为空")
    private LocalDate signDate;

    /**
     * 合同总金额（未优惠前）
     * 精度：12位数字，2位小数，不能为负数
     */
    @NotNull(message = "合同总金额不能为空")
    private BigDecimal totalAmount;

    /**
     * 优惠金额
     * 例如：1000.00表示优惠1000元，默认0.00，不能为负数
     * 精度：12位数字，2位小数
     */
    @NotNull(message = "优惠金额不能为空")
    private BigDecimal discountAmount;

    /**
     * 折扣率
     * 小数形式，例如0.95表示95折，默认1.00（无折扣），0 < 折扣率 <= 1
     * 精度：5位数字，2位小数
     */
    @NotNull(message = "折扣率不能为空")
    private BigDecimal discountRate;

    /**
     * 合同签订金额（最终实际金额）
     * 精度：12位数字，2位小数，不能为负数
     */
    @NotNull(message = "合同签订金额不能为空")
    private BigDecimal signedAmount;

    /**
     * 预期工期
     * 单位：天，必须为正数
     */
    @NotNull(message = "预期工期不能为空")
    private Integer expectedDuration;

    /**
     * 周末是否施工
     * 枚举值：1-是（不施工），2-否（施工）
     */
    @NotBlank(message = "周末是否施工不能为空")
    private String noWeekendWork;

    /**
     * 节假日是否施工
     * 枚举值：1-是（不施工），2-否（施工）
     */
    @NotBlank(message = "节假日是否施工不能为空")
    private String noHolidayWork;

    /**
     * 预计开工日期
     * 格式：YYYY-MM-DD
     */
    @NotNull(message = "预计开工日期不能为空")
    private LocalDate expectedStartDate;

    /**
     * 预计完工日期
     * 格式：YYYY-MM-DD
     */
    @NotNull(message = "预计完工日期不能为空")
    private LocalDate expectedEndDate;

    /**
     * 特殊条款
     * 长文本，可包含补充协议等内容
     */
    private String specialTerms;

    /**
     * 合同备注
     * 用于记录其他需要说明的信息
     */
    private String remarks;

    /**
     * 审核状态
     * 枚举值：0-待审核，1-审核中，2-审核通过，3-审核驳回
     * 用于更新合同审核状态
     */
    private String auditStatus;

    /**
     * 合同相关文件列表
     * 用于更新合同关联的文件信息
     */
    private List<ContractFile> contractFiles;
}